# Freedom of Expression in Interpersonal Interactions
# Taylor N. Carlson and Jaime E. Settle
# PS: Political Science and Politics Symposium
# Replication Materials
# Updated October 20, 2022

rm(list=ls())

# Load Packages with relevant versions
library(Require)
Require("tidyverse (==1.3.1)")
Require("estimatr (==0.18.0)") # Requires compilation to run this version
Require("ggpubr (==0.2.1)")
Require("margins (==0.3.23)")
Require("dotwhisker (==0.5.0)")
Require("MASS (==7.3-51.4)")
Require("cregg (==0.3.0)")

# Load in the Data

## Set working directory to wherever you have the data stored
setwd() # Update for your workflow
d <- read.csv("free_expression_data.csv")
  # Dataset for main analyses presented in the text and some exploratory analyses in the appendix
d2 <- read.csv("free_expression_data_mm.csv")
  # Dataset for marginal means analysis (variables are recoded as factors)
# Convert feature variables to factors
factors <- c("relationship", "context", "copartisan", "knowledge", "mediapref",
             "engage", "coethnic", "cogender", "ID", "HidAttribute8", "Q45", "trust_media", "ppgender", "Q33")
d2[factors] <- lapply(d2[factors], factor)

# Create Figure 1

# Baseline Model 
base_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d, clusters = ID)
summary(base_mod)
  # Note: Coefficient on co_pid is .072094, as referenced in the text
  # Creates Appendix Table B.1

base_mod_df <- tibble(attr = names(coef(base_mod)), coef = base_mod$coefficients, conf_high = base_mod$conf.high, conf_low = base_mod$conf.low)

base_mod_df <- broom::tidy(base_mod) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity3 = "Discussant is Same Race/Ethnicity",
                     co_gender = "Discussant is Same Gender")

p <- dwplot(base_mod_df, 
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>% # plot line at zero _behind_ coefs
  +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") + 
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion") + 
  scale_colour_grey() +
  theme(plot.title = element_text(face="bold")) + 
  theme(legend.position="none")
p

# Pre-registered Robustness Checks

## 1. Exclude Independents (Appendix Figure C.1)

base_mod_noind <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d[d$QPID100=="Republican" | d$QPID100=="Democrat",], clusters = ID)
summary(base_mod_noind)

base_mod_noind_df <- broom::tidy(base_mod_noind) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity3 = "Discussant is Same Race/Ethnicity",
                     co_gender = "Discussant is Same Gender")

p <- dwplot(base_mod_noind_df, 
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>% # plot line at zero _behind_ coefs
  +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") + 
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion\n(No Independents)") + 
  scale_colour_grey() +
  theme(plot.title = element_text(face="bold")) + 
  theme(legend.position="none")
p

# 2. Recode coethnicity to be white vs. [Latino, Black, or Asian] (co_ethnicity2 in the dataset) (Appendix Figure C.2)

## Update model
base_mod_coeth <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity2 + co_gender, data = d, clusters = ID)
summary(base_mod_coeth)

base_mod_coeth_df <- broom::tidy(base_mod_coeth) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity2 = "Discussant is Coethnic",
                     co_gender = "Discussant is Same Gender")

p <- dwplot(base_mod_coeth_df, 
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>% # plot line at zero _behind_ coefs
  +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") + 
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion\n(Coethnicity = White vs. [Latino, Black, or Asian])") + 
  scale_colour_grey() +
  theme(plot.title = element_text(face="bold")) + 
  theme(legend.position="none")
p



# 3. Present results without cluster-robust SE (Appendix Figure C.3)

base_mod_nocse <- lm(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d)
summary(base_mod_nocse)

base_mod_nocse_df <- broom::tidy(base_mod_nocse) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity3 = "Discussant is Same Ethnicity",
                     co_gender = "Discussant is Same Gender")

p <- dwplot(base_mod_nocse_df, 
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>% # plot line at zero _behind_ coefs
  +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") + 
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion\n(No Cluster Robust Standard Errors)") + 
  scale_colour_grey() +
  theme(plot.title = element_text(face="bold")) + 
  theme(legend.position="none")
p

# 4. Present results with ordered logit instead of ols (Appendix Table C.1)
base_mod_ologit <- polr(as.factor(Q69E) ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d)
summary(base_mod_ologit)

# 5. Recode DV to dichotomous measure where 1=likely or very likely and 0 = otherwise (express_dum in dataset) (Appendix Figure C.4)

## Model
base_mod_logit <- glm(express_dum ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d, family = binomial)
summary(base_mod_logit)

base_mod_logit_df <- broom::tidy(base_mod_logit) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity3 = "Discussant is Same Ethnicity",
                     co_gender = "Discussant is Same Gender")

p <- dwplot(base_mod_logit_df, 
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>% # plot line at zero _behind_ coefs
  +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") + 
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion\n(Logit)") + 
  scale_colour_grey() +
  theme(plot.title = element_text(face="bold")) + 
  theme(legend.position="none")
p

# Exploratory Analyses 

## Moderators 

# 1. Trust in mainstream media (Q45) (Appendix Figure D.1)

trust_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + Q45 * fringe + partisan + highly_engaged + co_ethnicity2 + co_gender, data = d, clusters = ID)
trust_margins <- as.data.frame(summary(margins(trust_mod, variable = 'fringe', at = list(Q45 = (c(0:3)))))) %>% mutate(mod = 'Trust in Media') %>% rename(level = Q45)

## Prepare to plot MEs
trust_mes <- trust_margins %>% mutate(mod = factor(mod, levels = c('Trust in Media')))
#trust_mes

trust_plot <- ggplot(trust_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Trust in Media', y = 'Average Marginal Effect of Preferring Fringe Media on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
trust_plot



# 3. Political Engagement (Q33) (Appendix Figure D.2)

engage_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + Q33 * highly_engaged + co_ethnicity2 + co_gender, data = d, clusters = ID)
engage_margins <- as.data.frame(summary(margins(engage_mod, variable = 'highly_engaged', at = list(Q33 = (c(0:4)))))) %>% mutate(mod = 'Political Engagement') %>% rename(level = Q33)

## Prepare to plot MEs
engage_mes <- engage_margins %>% mutate(mod = factor(mod, levels = c('Political Engagement')))
#engage_mes

engage_plot <- ggplot(engage_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Political Engagement', y = 'Average Marginal Effect of Highly Engaged Discussant on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
engage_plot

# 4. Gender (ppgender)

## (a) ME of knowledge by gender (Appendix Figure D.3)

gender_know_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + ppgender * knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d, clusters = ID)
gender_know_margins <- as.data.frame(summary(margins(gender_know_mod, variable = 'knows_more', at = list(ppgender = (c('Male', 'Female')))))) %>% mutate(mod = 'Gender and Knowledge') %>% rename(level = ppgender)

#gender_know_margins
#gender_know_mod

## Prepare to plot MEs
gender_know_mes <- gender_know_margins %>% mutate(mod = factor(mod, levels = c('Gender and Knowledge')))
#gender_know_mes

gender_know_plot <- ggplot(gender_know_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Gender', y = 'Average Marginal Effect of Knowledgeable Discussant on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
gender_know_plot

## (b) ME of engagement by gender (Appendix Figure D.4)

gender_engage_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + ppgender * highly_engaged + co_ethnicity3 + co_gender, data = d, clusters = ID)
gender_engage_margins <- as.data.frame(summary(margins(gender_engage_mod, variable = 'highly_engaged', at = list(ppgender = (c('Male', 'Female')))))) %>% mutate(mod = 'Gender and Engagement') %>% rename(level = ppgender)

#gender_engage_margins
#gender_engage_mod

## Prepare to plot MEs
gender_engage_mes <- gender_engage_margins %>% mutate(mod = factor(mod, levels = c('Gender and Engagement')))
#gender_engage_mes

gender_engage_plot <- ggplot(gender_engage_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Gender', y = 'Average Marginal Effect of Knowledgeable Discussant on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
gender_engage_plot

## (c) ME of copartisanship by gender (Appendix Figure D.5)

gender_copid_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + ppgender * co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d, clusters = ID)
gender_copid_margins <- as.data.frame(summary(margins(gender_copid_mod, variable = 'co_pid', at = list(ppgender = (c('Male', 'Female')))))) %>% mutate(mod = 'Gender and Copartisanship') %>% rename(level = ppgender)

#gender_copid_margins
#gender_copid_mod

## Prepare to plot MEs
gender_copid_mes <- gender_copid_margins %>% mutate(mod = factor(mod, levels = c('Gender and Copartisanship')))
#gender_copid_mes

gender_copid_plot <- ggplot(gender_copid_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Gender', y = 'Average Marginal Effect of Copartisan Discussant on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
gender_copid_plot

## Shared Identity 

gender_gen_mod <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + ppgender * HidAttribute8, data = d, clusters = ID)
gender_gen_margins <- as.data.frame(summary(margins(gender_gen_mod, variable = 'HidAttribute8', at = list(ppgender = (c('Male', 'Female')))))) %>% mutate(mod = 'Gender') %>% rename(level = ppgender)
summary(gender_gen_mod)
#gender_gen_margins
#gender_gen_mod

## Prepare to plot MEs
gender_gen_mes <- gender_gen_margins %>% mutate(mod = factor(mod, levels = c('Gender')))
#gender_gen_mes

gender_gen_plot <- ggplot(gender_gen_mes, aes(x = level, y = AME)) + geom_point() + 
  geom_errorbar(aes(x = level, ymin = lower, ymax = upper), width = 0) +
  facet_wrap(~mod, ncol = 1) + 
  geom_hline(yintercept = 0, linetype = 'dashed') +
  labs(x = 'Respondent Gender', y = 'Average Marginal Effect of Female Discussant on True Expression') +
  theme(legend.position = 'bottom', panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = 'black', fill = NA),
        strip.background = element_rect(color = "black", size = .75))
gender_gen_plot



# ----- Marginal Means (Appendix E) ----- # 

# Descriptive statistics of the DV
prop.table(table(d2$Q69E))
mean(d2$Q69E, na.rm=T)

# Appendix Figure E.1: 

mmresults <- mm(d2, Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                id= ~ID,
                feature_labels = list(relationship = "Relationship", context = "Context", copartisan = "Copartisan", knowledge = "Knowledge",
                                      mediapref = "News Preference", engage = "Engagement", coethnic = "Ethnicity", cogender = "Gender"))
mmresults

# Plot the results 
mmplot <- plot(mmresults,
               feature_headers = FALSE,
               vline = .5, feature_labels = FALSE,
               size = 2.5) +
  ggplot2::facet_wrap(~feature, ncol = 1L, scales = "free_y", strip.position = "right") + 
  xlab("Marginal Mean") +
  theme_bw() + 
  theme(axis.text = element_text(size = 12), axis.title = element_text(size=12), plot.title = element_text(size = 12), strip.text = element_text(size = 6), legend.position="none") +
  scale_colour_manual(values = c("black", "black", "black", "black", "black", "black", "black", "black"))
mmplot


# --- Marginal Means for Heterogeneous Effects in Appendix F --- # 

# Trust in mainstream media 

## Appendix Figure F.1

mm_by_trust2 <- cj(d2,
                   Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                   id= ~ID,
                   estimate = "mm",
                   by = ~Q45)

plot(
  subset(mm_by_trust2,
         feature %in% "mediapref"),
  group = "Q45",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Trust in Media"
)

## Appendix Figure F.2

mm_by_trust <- cj(d2,
                  Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                  id= ~ID,
                  estimate = "mm_diff",
                  by = ~trust_media
                  )
plot(
  mm_by_trust,
  vline = 0,
  xlab = "Estimated Difference in Marginal Means\nTrust in Media"
) + 
  scale_colour_manual("feature", values = rep("Black", 9)) + 
  ggplot2::theme(legend.position = "none")



# Political Engagement (Appendix Figure F.3)

mm_by_engage <- cj(d2,
                   Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                   id= ~ID,
                   estimate = "mm",
                   by = ~Q33)

plot(
  subset(mm_by_engage,
         feature %in% "engage"),
  group = "Q33",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Political Engagement"
)

# Gender (Appendix Figure F.4-F.5)

## Appendix Figure F.4
mm_by_gender_know <- cj(d2,
                   Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                   id= ~ID,
                   estimate = "mm",
                   by = ~ppgender)

plot(
  subset(mm_by_gender_know,
         feature %in% "knowledge"),
  group = "ppgender",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Gender"
)

## Appendix Figure F.5
mm_by_gender_engage <- cj(d2,
                        Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                        id= ~ID,
                        estimate = "mm",
                        by = ~ppgender)

plot(
  subset(mm_by_gender_engage,
         feature %in% "engage"),
  group = "ppgender",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Gender"
)

## ME of copartisanship by gender (Appendix Figure F.6)

mm_by_gender_pid <- cj(d2,
                        Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
                        id= ~ID,
                        estimate = "mm",
                        by = ~ppgender)

plot(
  subset(mm_by_gender_pid,
         feature %in% "copartisan"),
  group = "ppgender",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Gender"
)

## Shared Identity 

# Gender 

mm_by_gender_gender <- cj(d2,
                       Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + HidAttribute8, 
                       id= ~ID,
                       estimate = "mm",
                       by = ~ppgender)

plot(
  subset(mm_by_gender_gender,
         feature %in% "HidAttribute8"),
  group = "ppgender",
  xlab = "Estimated Marginal Means",
  feature_headers = FALSE,
  legend_title = "Gender"
)

# Appendix H

## Figure H.1
base_mod_ind <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d[d$QPID100=="Independent" | d$QPID100=="Something else",], clusters = ID)
base_mod_rep <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d[d$QPID100=="Republican",], clusters = ID)
base_mod_dem <- lm_robust(Q69E ~ close_relationship + f2f_context + co_pid + knows_more + fringe + partisan + highly_engaged + co_ethnicity3 + co_gender, data = d[d$QPID100=="Democrat",], clusters = ID)

p <- dwplot(list(base_mod_ind, base_mod_rep, base_mod_dem),
            vline=geom_vline(xintercept = 0, colour = "grey60", linetype = 1)) %>%
  relabel_predictors(close_relationship = "Close Relationship",
                     f2f_context = "Face to Face",
                     co_pid = "Copartisan",
                     knows_more = "Discussant More Knowledgeable",
                     fringe = "Discussant Prefers Fringe Media",
                     partisan = "Discussant Prefers Partisan Media",
                     highly_engaged = "Discussant Highly Engaged",
                     co_ethnicity3 = "Discussant is Same Race/Ethnicity",
                     co_gender = "Discussant is Same Gender") +
  theme_bw() + theme(panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank()) + 
  xlab("Coefficient Estimate\nLikelihood of Expressing True Opinion") + ylab("") +
  ggtitle("Effect of Discussant Attributes on\nLikelihood of Expressing True Opinion") +
  scale_colour_grey(labels = c("Independents", "Republicans", "Democrats")) + 
  theme(plot.title = element_text(face = "bold"),
        legend.title = element_blank(),
        legend.position = c(.15, .9))
p

# Other robustness checks: 

# Test for heterogeneity by profile order 
## Create variable for order 
cj_anova(d2, Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
         by = ~profile_number)
# p>.05

cj_anova(d2, Q69E ~ relationship + context + copartisan + knowledge + mediapref + engage + coethnic + cogender, 
         by = ~convoNum)
# p>.05


